{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c17fa2b0",
   "metadata": {},
   "source": [
    "# 自定义处理数据集\n",
    "我们可以使用mindspore中的`dataset`模块来加载数据集，即将数据集加载到系统内存中，并进行基本的数据处理操作。在那之前，我们先创建一个数据集，假设我们要拟合的函数为：\n",
    "\n",
    "$$f(x)=2x+3  $$\n",
    "\n",
    "我们可以使用Python中的`random`模块随机生成数据，其为满足标准高斯分布的随机值："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c90271bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "def create_data(data, w=2.0, b=3.0):\n",
    "    for item in range(data):\n",
    "        # 使用uniform均匀分布数据\n",
    "        x = np.random.uniform(-10.0, 10.0)\n",
    "        # 指定一个噪声来模拟数据\n",
    "        # 使用normal使其满足高斯分布,参数为数据的中间值和浮动值\n",
    "        noise = np.random.normal(0, 1)\n",
    "        y = w * x + b + noise\n",
    "        # 使用yield返回数据生成器，方便后续对数据进行处理\n",
    "        yield np.array([x]).astype(np.float32), np.array([y]).astype(np.float32)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c5335fa",
   "metadata": {},
   "source": [
    "使用matplotlib将数据集可视化："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "714e6c91",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGdCAYAAAA8F1jjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/n0lEQVR4nO3deVzU1f7H8TeogBu4g5Sak6WWprZoWLaoSWaWLZbaImZZRotpi7ZoeStN/VXXrqXdSixT025pq2XmmktpWmppGa4pmHoBEwSB8/vjexkYmEGWGWZ7PR8PHvQ98/1+OdPE5X3POd/PCTHGGAEAAPigUG93AAAAwBWCCgAA8FkEFQAA4LMIKgAAwGcRVAAAgM8iqAAAAJ9FUAEAAD6LoAIAAHxWdW93oLLy8/N14MAB1a1bVyEhId7uDgAAKANjjI4dO6bY2FiFhroeN/H7oHLgwAE1a9bM290AAAAVsG/fPp1++ukuX/f7oFK3bl1J1huNjIz0cm8AAEBZZGRkqFmzZva/4674fVApmO6JjIwkqAAA4GdOtWyDxbQAAMBnEVQAAIDPIqgAAACfRVABAAA+i6ACAAB8FkEFAAD4LIIKAADwWQQVAADgswgqAADAZxFUAACAzyKoAAAAn0VQAQAgwCUnS7NmWd/9jd9vSggAAFxLTpbat5cyM6VataQtWySbzdu9KjtGVAAACGCrVlkhRbK+r1rl3f6UF0EFAIAA1q2bNZIiWd+7dfNuf8qLqR8AAAKYzWZN96xaZYUUf5r2kQgqAAAEPJvN/wJKAaZ+AACAzyKoAAAAn0VQAQAgyPlynRXWqAAAEASSk50vqC21zooxUlqaVL++N7osiREVAAACXkEYSUiwvhcdOXFZZ2XTJik0VGrQQPryy6rush1BBQCAAFda0TendVYeekg6//zCk2JiqqyvxTH1AwBAgCsIIwXTO0WLvhWts3JZp2NqeWak48Uffyx16lS1HS6CoAIAQIA7VdE3m02y/fKZ1KGv4wtpaVJUVJX10xmCCgAAQcBl0TdjpCuvlFasKGy7915p+vQq61tpCCoAAASrffuk5s0d2374QbrwQu/0xwkW0wIAEIymTnUMKVFRUk6OT4UUiREVAACCS26u1KiRlJ5e2PbKK9KIEV7rUmkIKgAABIuNG0uOmOzZU3L6x4cw9QMAQDC4/37HkHL55VJ+vk+HFIkRFQAAAltGRslHjBctkq67zjv9KSdGVAAACFSLFpUMKenpfhNSJIIKAAB+r8Tux8ZIl14q9etXeNIDD1jtkZHObuGzmPoBAMDPFN0JWXLc/fjXxXvU/LIzHC/48UevlsGvDIIKAAB+pGAn5IJg8uyzhRsODst8Rc0vG1l4csOGUkqKVN1//9z7b88BAAhCxXdClqTImid1IKueaiuz8MTXXrOme/wcQQUAAD9SfCfkQWf9oMeyOjuetG+fdPrp3umgm7GYFgAAP1KwE3JSknSw7zCddkORkNKjh1UbpZSQUmLhrY9jRAUAAD9ja5AmW0J9x8bPPpP69Cn1uuLrW7ZscbGjsg9hRAUAAH/y0UdS/WIhJSPjlCFFKrm+ZdUqD/TPzQgqAAD4A2Okiy+WbrqpsO3hh632unXLdIuC9S2S9b3g8WZf5tGgMmHCBF100UWqW7eumjRpon79+mnHjh0O55w4cUKJiYlq2LCh6tSpo5tuukmpqame7BYAAP5l924pNFRav76wbfNm6dVXy3WboutbPv/cGlHx9bUqHg0qK1asUGJiotatW6clS5bo5MmT6tWrl44fP24/55FHHtGnn36qBQsWaMWKFTpw4IBuvPFGT3YLAAD/MWWK1LJl4XF0tJSbK3XoUKHb2WzWSEqfPlJCgrVmxZfDikcX0y5evNjhOCkpSU2aNNHGjRt12WWXKT09XW+//bbmzJmj7t27S5Jmzpyptm3bat26dbr44os92T0AAHxScrL03bIc3X5/XYXk5BS+8Prr0vDhlb6/s7Uqvrqotkqf+klPT5ckNWjQQJK0ceNGnTx5Uj179rSf06ZNGzVv3lxr1651GlSys7OVnZ1tP87IyPBwrwEAqDrLl0vPXLVOq3LjHF/4808pNtYtP6N4LRZfXqtSZYtp8/PzNWLECF1yySVq166dJCklJUVhYWGqV6+ew7nR0dFKSUlxep8JEyYoKirK/tWsWTNPdx0AgCqRnCzt6jHUIaT82a6XtWDWTSFFclyr4uuPKFfZiEpiYqK2bt2q1atXV+o+Y8aM0ciRhfsYZGRkEFYAAP7vv/+V7cwGKpoZ+lb/Uv9cdLVHfpzN5tsBpUCVBJUHHnhAn332mVauXKnTi1TLi4mJUU5OjtLS0hxGVVJTUxUTE+P0XuHh4QoPD/d0lwEAqDoLFki33OLQ1KDGMX30dR2/CBOe5NGpH2OMHnjgAX388cf69ttv1bLoqmVJF1xwgWrUqKGlS5fa23bs2KG9e/cqLi6u+O0AAAgsxkgXXugQUtKGjtKsJKMN2+voiiu81zVf4dERlcTERM2ZM0eLFi1S3bp17etOoqKiVLNmTUVFRWno0KEaOXKkGjRooMjISD344IOKi4vjiR8AQGD74w+pVSvHtp9/Vr327dUtubBqbLCPqIQYY4zHbh4S4rR95syZSkhIkGQVfBs1apTmzp2r7OxsxcfH6/XXX3c59VNcRkaGoqKilJ6ersjISHd1HQAAz5kwQXryycLj006T9uyRqlXzy/14KqKsf789OqJSlgwUERGhadOmadq0aZ7sCgAA3peTY6WPvLzCthkzpGHD7If+VOOkKrB7MgAAVWHNGumSSxzbDhyQmjZ1aPKnGidVgU0JAQDwtDvvdAwp11xjLaQtFlIk/6pxUhUYUQEAwFOOHpUaNnRs+/pr6aqrSr3MX2qcVAVGVAAA8IR580qGlL//PmVIgSOCCgAA7mSMtbPxwIGFbY8/brXXru29fvkppn4AAHCXnTuls85ybNu6VTr33FIvS/5f3ZRu3ZjyKY4RFQAA3OH55x1DSosWUm5umUJK+/ZSQoL1PTnZs930N4yoAABQGdnZUkSEY9tbb0lDh5bpcuqmlI4RFQAAyiA5WZo1q9iIx6pVJUNKSkqZQ4pUWDdFom6KM4yoAADgQsHakRYtpD59ipW1f3qQNHdu4cnXXSctWlTun1FQN4U1Ks4RVAAAcKLonjthYVb1e0mKyDwi25mNHE/+5hupR48K/yzqprjG1A8AAE4UXTuSk2OFlUF6X0dULKQcP15qSHE6ZYQyI6gAAOCEw9qRmkZHm56j93W7/fUXNUa1axklp9RyeQ+e6Kk8ggoAAE4UrB35aOJvOp4Vqtp7frW/1la/6Cm9aH9KxxVnT/SgfAgqAAC4YHvvOd0wunVhw5lnKvn3PO2t1VbSqZ/S4YmeymMxLQAAxZ04IdWs6dg2c6aUkCCbSj6l46qyLE/0VB5BBQCAolaulC6/3LEtNVVq0sR+WPQpnaJPB9kfXS4WVggoFcfUDwAABW65xTGk3HijtZlgkZBSHOtQPIsRFQAA/vqrZBj59lvpyitPeWnBOpSCERXWobgXQQUAENzefVcaPNixLTOz5BoVF1iH4lkEFQBAcMrPl9q0kX7/vbDtmWek8ePLfSvWoXgOQQUAEHy2b5fati3Z1rq18/PhNSymBQAEl2eecQwprVtLeXmEFB/FiAoAIDhkZRVWXyvw7rvSHXd4pz8oE4IKACDwLVsmde/u2HbokNS4sXf6gzJj6gcAENhuvNExpNxyi1UbhZDiFxhRAQAEpkOHpOhox7YVK6TLLvNOf1AhjKgAAALPzJklQ0pWFiHFDxFUAACBIz/fKmhy112Fbc8+a031RER4rVuoOKZ+AACB4ZdfpHPPdWz77TfprLO80x+4BSMqAAD/9+STjiHl3HOt0RVCit9jRAUA4L8yM6XatR3b3n9fGjTI6enJyezJ428IKgAA//TNN9JVVzm2HT4sNWzo9PTkZKl9+8JdjrdsIaz4A6Z+AAD+57rrHEPKoEHWglkXIUWyRlIyM61/zsy0juH7GFEBAFS5Ck/BpKRITZs6tq1aJV166Skv7dbNGkkpGFHp1q18fYZ3EFQAAFWqwlMwb70l3XOPY9uJE1J4eJl+rs1m/SzWqPgXggoAoEo5m4IpNTTk5UktW0r79hW2Pf+89NRT5f7ZNhsBxd+wRgUAUKUKpmCkMkzBbN0qVa/uEFL2Lv1ds05/SsnJnu0nfANBBQBQpQqmYJKSTjHt8/jj1hxRgY4dlbwzX237tlJCgvVSecJKcrI0a1b5roH3MfUDAKhypU7BHD8u1anj2DZvnnTrrVo1q2zTRsUX6/Josv8iqAAAfMfXX0vx8Y5tR45IDRpIKtuTO85CSbnXxcBnMPUDAKhyTqdhrrnGMaTceadVG+V/IUUq27SRs1BSrnUx8CmMqAAAqlTxEY9flh5Ui7hYx5PWrJHi4pxef6ond5yNuvBosv8iqAAA3MJVEbfi7UVHPG7PnKEWcfcVnly9urVGJSyswj/XVSjh0WT/RFABAFSaq8Wqztq7dZPq1MzTjqxmitXBwptMmCCNHu2Wn0soCRysUQEAVJqrfXScLmL9+2cdy6ruGFL++KPcIaW0n4vAQVABAFSaq8WqxduvXzVK6tCh8MILL5Ty8ys8/MEi2cAXYowx3u5EZWRkZCgqKkrp6emKjIz0dncAIGiVtkZl7ZK/ddt9dR0vWLBAuvlmj/1c+Lay/v1mjQoAwC1crQux7fhStvuucWw8elSqX9+jPxeBgakfAIDn9Opl1UcpcNddVm0UN4UUBD5GVAAA7vfnn9Lppzu2rVsndeninf7AbzGiAgBwrzfecAwpERFSdjYhBRVCUAEAuEdurtSkiXT//YVtkydLWVnlKuAGFMXUDwCg8jZvljp1cmzbtUs64wxv9AYBhBEVAEDlPPywY0i5+GKrNgohBW7AiAoAoGKOHZOK17/46CPphhu80x8EJEZUACBIJSdLs2ZZ38vt889LhpS0NOmGGyp3X6AYRlQAIAi52szvlIyRuneXli8vbBs2TJoxo3L3BVwgqABAECptE0GXpej375eaNXNs+/576aKLSr0vQQWVwdQPAASh4pv5tWhhjYQkJFjfi0/bHB73mmNIqVNHyslxCCnO7ssmgagsggoABCGbzZqWSUqyvu/Z43yERbm5youqr0bjH7Jfe/jpV6yFtDVqnPK+jKagspj6AYAgVXQzv717HV9r0ULSjz9KF1ygakXam2uP/tGquQaX8b5AZTGiAgDQDz84Hkc9mShdcIH9+LvQSxWifB2p1ZzpHFQpRlQAAHZ1laEMRUlrizQuWqSm7a5TUmkLbQEPIagAAHTRRdIN1T7RR3nXO76Qni5FRsomAgq8g6kfAAhyyX8Y1ejRzTGk3H+/VTOleFE3oIoxogIAwWzvXtlatVDRwZJPn92ovuPO91qXgKIYUQGAYPXqq/97vMfyX9VTZM2TOvcOQgp8ByMqABBsTp6UGjSQ/v7b3nR47FR9bntQm1ksCx9DUAGAYLJhQ4lqstq7V42aNSu1NgrgLUz9AECAK9jNOGPQfY4h5YorpPz8kvv3AD7Eo0Fl5cqV6tu3r2JjYxUSEqKFCxc6vG6M0dixY9W0aVPVrFlTPXv21O+//+7JLgFAUElOli5pl67BCSGKnDvD3r50xKdKfnuZFBLixd4Bp+bRoHL8+HF16NBB06ZNc/r6pEmTNHXqVE2fPl3r169X7dq1FR8frxMnTniyWwAQNPa8+rEOZtVzaIuumaGer17rdPNBwNd4dI1K79691bt3b6evGWP06quv6umnn9b111vP7r/77ruKjo7WwoULNWDAAE92DQD8UnKytWHgKSvEGiN17aor162zN71e/UEdf3GqDj1uHRdsPsjiWfgyr61R2bVrl1JSUtSzZ097W1RUlLp06aK1a9e6vC47O1sZGRkOXwAQDJKTpfbtpYQElT4asnu3FBoqFQkpnzy3SVfvmKqbbpJq1bLaatUS+/bA53ktqKSkpEiSoqOjHdqjo6PtrzkzYcIERUVF2b+asQgMQJBYtcoaBZEKR0NKmDJFatmy8LhxY+nkSbW7vaP9/C1bpKQk6zujKfB1fvfUz5gxY5Senm7/2rdvn7e7BABVolu3UkZDTp6UataUHnussO1f/5IOHVLy3uoOIzGSNHgwIQX+wWt1VGJiYiRJqampatq0qb09NTVVHTt2dHldeHi4wsPDPd09APA5Nps1ClJijcr330tdujievH+/dNppkpyPxBBS4C+8NqLSsmVLxcTEaOnSpfa2jIwMrV+/XnFxcd7qFgD4NJut2GjI3Xc7hpSrrrIW0v4vpEinGIkBfJxHR1T+/vtv7dy50368a9cubd68WQ0aNFDz5s01YsQIPf/88zrrrLPUsmVLPfPMM4qNjVW/fv082S0A8H9paVL9+o5tX3wh9e5d4skglyMxgB/waFDZsGGDrrzySvvxyJEjJUmDBw9WUlKSHn/8cR0/flzDhg1TWlqaLr30Ui1evFgRERGe7BYA+LcPP5T693dsO3ZMqlPH/mRQZqY1elKwYLbgC/A3IcYY4+1OVEZGRoaioqKUnp6uyMhIb3cHADzHGKlzZ2u/ngKPPCK9/LL9cNYsa9FsgaQka6oI8DVl/fvNpoQA4Af2rtil5lcUGxL56SfpvPMcmgrWoxSMqLAeBf7O7x5PBoBgc+SJlxxCSm6TplJubomQIhWuR6FOCgIFIyoA4KtycqRatdQwL8/edK+mq+ukezW4mhf7BVQhggoA+KK1a6WuXR2aYvWn0mvF6olSpnNcLaYF/BVTPwDgaxISHELKl7paITI6XCNWn39eevAoU5l9wI8wogIAblbmHY6LO3pUatjQoSlei/W14iVZVfL37Cn9FiymRaAhqACAG1V46mX+fOnWWx2adm35W6s615ayrOOIiFMHD4q7IdAQVADAjcq9r44xUqdO1qPGBR59VJo8WS0lbd0q/ec/VvNNN5UteFDcDYGEoAIAblSuqZc//pBatXJs27JFatfOfmizOW6IDAQbFtMCgBuVuY7Jiy86hpRmzazaKEVCCgBGVADA7UqdesnOthabFPXvf1u7IAMogaACAFXlu++kSy91bDt4UIqJ8U5/AD/A1A8AVIXbbnMMKddeay2kJaQApWJEBQA86cgRqVEjx7YlS6SePb3TH8DPMKICAG6WnCzNmiWlvjq3ZEg5ftxlSCm4Ljm5CjoJ+AlGVADAjZKTpfbtjNZntVe0ttnbt/QZrdpTJ8hWq5Tr2KMHKIERFQBwo80LftfxrFC1KxJSLojYpvM+n6B27aTJk52PmLjao4dRFgQ7ggoAuMs//qEbR59tP9wV0lKTJ+bpxxPnSJKysqTHH7dGTooHj4JCcVJhobiCUZaEBOfXAMGAoAIAlXXihBQSIo0da2/6bug7MjuTdVP/UHsAKeBsV2NnheLYCRlgjQoAVM7KldLllzu2paTokuho++GWLdZ+PWPHWpnGVWn94oXi2AkZYEQFACpuwADHkNKvn1UbpUhIkQr369m2rQyl9YtdV6Zy/EAAY0QFAMrr8GGpcWPHtqVLpe7dS72sIrsasxMygh0jKgCCTqWepJk9u2RIycw8ZUgBUDEEFQBBpbQnaUoNMPn5Ups20h13FLY99ZQ11VOzpqe7DQQtpn4ABBVnT9LYbKcouLZjhxVSiugU8av+c1cbVcWsTHKy1c9u3ZgGQvBhRAVAUHFWr0Qq5VHgceMcQspvOkuhytPmE22q5HFhaqkg2DGiAiCoFDxJU3SEIjlZOnTImsHJyrICzGUXZUkhjgVQDk2epU7j7pSpwseFXY0AAcGCoAIg6BR9kqbolE9EhDRpknTbacsVe+6VjhcdOqQmjRtry41VOw1DLRUEO4IKgKBWdMTixAmp//ybFbvhP4Un3HyztGCB/bB4yPF0aHE2AgQEE4IKAJ/m6TBQMGJRO/OQDila2lDkxeXLS1adLdKvqtrtmFoqCGYEFQA+qyrCgM0m7Xp2lpo8nuD4QlaWNRfkAmtHgKrBUz8AfJbHN+XLz5datXIMKePGWbVRSgkpkuunhwC4FyMqAHxWRRaSlnmq6NdfpXPOcWzbvl1q3bpMfWPtCFA1CCoAfFZ5w0CZp4qeekp68cXC47Ztpa1bpdDyDTKzdgTwPIIKAJ9WnjBQfKpozBhpwoQi1xcUSSnirrDZevqz22RjIhzwSfxqAggY3bo5brszf77Urt3/qrkuXVoipDTSX5qZc1uVVJgFUDEEFQABw2aTnnvOsS0rS8q48nqpZ09721wNUIiMjqgRC2EBH0dQARBQbrqp8IGdJkqVUYg67v3E/no3rdQgzZUk3X23Z+ufAKg8ggqAgGKzSdu2SV/0f0epinF47eUXsvRjLWv4pFYtaw0LIQXwbQQVAIElP1+2K1uo94Kh9qZnNF61axn1GxChLVukpCRGUgB/wVM/AALHtm3W6tki9n7zm1rtP0tbijzeTEAB/AdBBUBgGD1aeumlwuP27aWfflLzkBAN9l6vAFQSQQWAf8vMlGrXdmybM0caONA7/QHgVgQVAP5ryRKpVy/HtsOHpYYNvdMfAG7HYloA/qlPH8eQcvvt1maChBQgoDCiAsC/pKRITZs6tq1eLV1yiXf6A8CjGFEB4DbJydKsWf8rWe8Jb77pGFJCQqQTJwgpQABjRAWAW5R55+KKyMuTmjeXDhwobHvxRatiG4CARlAB4BbFdy5etcpNQeWPP6RWrRzbdu6UzjzTDTcH4OuY+gHgFt26FW5O7LaN/r7+WoqLKzzu1EnKzyekAEGEoALALWw2Vbo8vX2Ny/Yc6bHHpPh46a+/pEaNpA8+kH780VqXAiBoMPUDwG1stopP9xSscWmauVMfhA6U8jdYL9x/vzRlilSzpvs6CsBvEFQA+IRVq6QbM9/T67pfdfP/Vnbt+gqf/Y7Ur5+3uwbAiwgqALzv2DHduPB+DdZsSdKq0MvUfPFstbi0mZc7BsDbWKMCwLt++EHq1El1F86WCQ3VphvG67Tt3xJSAEhiRAWAt+TnS//3f9KTT0q5uVLz5gqZM0edKN4GoAiCCoCql5Ii3XmntamgJN18s1V1tn597/YLgM9h6gdA1fryS6lDByuk1KxpBZT58wkpAJwiqACoGtnZ0qhR0jXXSIcOWc8ib9gg3XMPtVEAuMTUDwDP++03aeBAq2CbJD3wgDR5shQR4d1+AfB5BBUAnmOM9O67UmKidPy41KCBNHOmdN113u4ZAD9BUAHgGRkZ0vDh0pw51vEVV0izZ0unnebVbgHwL6xRAeB+69dbGwjOmSNVqyY9/7z0zTdOQ4p9f59kL/QTgM9jRAWA++TnW2tPnn7aqo3SooUVVrp2dXp6wf4+mZnWjssV3cwQQOBiRAWAexw8aO12PHq0FVJuuUXavNllSJGs/X0yM61/zsy0jgGgKIIKgMr74gvpvPOs6Z1ataS33pLmzZPq1Sv1sm7drNMl63u3bp7vKgD/wtQPgIrLzrZGUF591Tru0EGaO1dq27ZMl9ts1nTPqlVWSGHaB0BxBBUAFbNjhzRggDW9I0kPPSS99FK5a6PYbAQUAK4RVACUjzFSUpJVtC0zU2rY0Dq+9lpv9wxAACKoACi79HTpvvus9SeS1L279N57Umysd/sFIGCxmBZA2axbJ3XsaIWUatWkCROkr78mpADwKJ8IKtOmTdMZZ5yhiIgIdenSRd9//723uwSgQF6eFUouvVTavVs64wxp9WprEW21at7uHYAA5/Wg8sEHH2jkyJEaN26cfvzxR3Xo0EHx8fE6dOiQt7sG4MABqVcv6cknrcBSsHj24ou93TMAQcLrQeXll1/WPffcoyFDhuicc87R9OnTVatWLb3zzjve7hoQ3D77zKqN8u23VpGTmTOtKrNRUd7uGYAg4tWgkpOTo40bN6pnz572ttDQUPXs2VNr1651ek12drYyMjIcvgC40YkT0sMPS337SkeOWOtSfvxRSkiQQkK83TsAQcarQeXw4cPKy8tTdHS0Q3t0dLRSUlKcXjNhwgRFRUXZv5o1a1YVXQWCw/bt1rTO1KnW8YgR1iLa1q292i0AwcvrUz/lNWbMGKWnp9u/9u3b5+0uAf7PGOntt6ULLpB++klq3Fj6/HPplVek8HBv9w5AEPNqHZVGjRqpWrVqSk1NdWhPTU1VTEyM02vCw8MVzv9wAu6Tlibde680f7513KOHVRulaVOvdgsAJC+PqISFhemCCy7Q0qVL7W35+flaunSp4uLivNgzIEisWWOtQZk/X6peXZo40aqNQkgB4CO8Xpl25MiRGjx4sC688EJ17txZr776qo4fP64hQ4Z4u2tA4MrLs0LJuHFSXp5ONrdp3nVzlRLaWTftZu8dAL7D60Hl1ltv1V9//aWxY8cqJSVFHTt21OLFi0sssAXgJn/+Kd1+u7R8uSTp774DZft6uv76V6QkK7ts3UpYAeAbQowxxtudqIyMjAxFRUUpPT1dkZGR3u4O4Ns++UQaMkQ6elSqXVuaNk2zzJ1KGOL42HFSkjR4sHe6CCA4lPXvt9dHVABUgRMnpMcek/71L+v4/POluXOls89Wt2QpIsI6RZJq1pS6dfNeVwGgKIIKEGCSk6VVq6ywYbNJ+uUXq/T9li3WCaNGSS+8YH/s2GaTtm2T/vMf6+WbbmLaB4DvIKgAASQ5WWrfXsrMlGrVNNr99Ftq/PzDUlaW1KSJNGuWdPXVJa6z2awBFwDwNQQVIICsWmWFlHr6r97MGqbGT31ovXDVVdK770ou6hMBgK/yu8q0AFzr1k3qHv6dNquj+utDmerVpcmTpcWLyx1SkpOtAZjkZA91FgDKgBEVIFDk5cn2/ov65uSzClG+TjY/UzU+nCtddFG5b+UwhVTLWt7CuhUA3sCIChAI9u+XuneXxo5VSH6+dPvtqrF1U4VCilQ4hSRZ31etcmNfAaAcCCqAv1u4UOrQQVq5UqpTx1qL8t57Ut26Fb5lt27WSIpkfedxZQDewtQP4K+ysqRHH5Vef906vvBCqzZKq1aVvrXNZk33ODzmDABeQFAB/NG2bVZtlK1breNHH7Vqo4SFue1H2GwEFADeR1AB/Ikx0ptvSiNGWKVko6OtR3Pi473dMwDwCIIK4C+OHpXuuUf66CPrOD7eCils4AkggLGYFvAHq1ZJHTtaIaVGDWnKFOmLLwgpAAIeIyqAL8vNlZ5/XvrHP6T8fGuh7Lx50gUXeLtnAFAlCCqAr9q7V7r99sIiJoMHS6+9VqnHjgHA3zD1A/iijz6ypnpWrbKCyezZUlISIQVA0GFEBfAlmZnSyJHSjBnW8UUXWbVRzjzTu/0CAC9hRAXwFVu3Sp07F4aUJ56QVq8mpAAIagQVwNuMkd54wxo92bbN2uX466+liRNdFnBjZ2MAwYKpH8CbjhyR7r7b2q9Hknr3ttaiNGni8pLSdjZOTqbsPYDAQlABvGXFCuupnv37rdookyZJDz0khZY+0OlsZ2ObrfQAAwD+iqkfoKrl5kpjx0rdu1sh5eyzpXXrrLL4pwgpkuudjZ0FGADwd4yoAFVpzx5p0CBpzRrreMgQaepUqU6dMt/C1c7GBQGmYESlIMAAgD8jqABV5cMPrb160tKseigzZkgDB1boVs52NnYVYADAnxFUAE/LzLSmdf79b+u4SxdpzhyPJAlnAQYA/BlrVIBSVPYx4P1f/Ky0sy60QkpIiDRmTOHqVwDAKTGiArhQqadojNHh8a+r0bOjFKFsHQxpKjPrPcXe0cOjfQaAQMOICuBChZ+iOXxY6tdPjZ59QBHK1mfqo/PMT1qST0gBgPIiqAAuuHoMuFTLlkkdOkiffCITFqZHa/xTffWpMms15ikcAKgAggrgQsFTNElJZZj2yc2VnnlG6tFDOnBAat1aIevX6/7tDykpKaTKiq9RWh9AoGGNClCKMj1Fs3u3VRtl7VrreOhQ6Z//lGrXlk1Vt26WyrQAAhEjKkBlzJ8vdexohZTISGnePOmtt6Tatau8K1SmBRCICCoISB6fAjl+3NpM8NZbpfR06eKLpc2brWMvqdCaGgDwcUz9IOB4fApk82ZpwABpxw6rNsqTT0rjxlkbC3oRlWkBBCKCCgKOq92FK80Y6bXXpMcek3JypNhYafZs6cor3XBz96AyLYBAQ1BBwPHI5nx//SXddZf02WfWcd++0jvvSI0aueHmAABXCCoIOG6fAvn2W+n226WDB6XwcGnKFCkx0Zr2AQB4FEEFAcktUyAnT1prTyZOtKZ92rSxnurp0MEtfQQAnBpBBXBm1y5p4EBp/Xrr+J57pFde8cpjxwAQzHg8GShu3jyrNsr69VJUlDR/vpJHv6lZH9am4isAVDFGVIACx49LDz4ozZxpHXftKs2Zo+S8FlR8BQAvYUQFkKRNm6Tzz7dCSkiItW/PihVSixZUfAUALyKoILgZI736qlVZ9rffpNNOs57yGT9eqm4NOFLxFQC8h6kfBK9Dh6QhQ6QvvrCOr79eevttqWFDh9Oo+AoA3kNQQUBITi5nkPjmG+mOO6SUFKs2yssvS8OHu6yNQsVXAPAOggr8Xrn29jl50lp/MmmSNe1zzjnWUz7t21dpnwEAZcMaFfi9Uy12LdhJee+yP6RLL5VeeskKKffeK/3wAyEFAHwYIyrwe6Xt7VMw2nJ95hzdoPskHZPq1ZPeeku66SZvdRkAUEYEFfi90ha7rl3yt6ZlPqAEzZIkpZ59qaKXvC81b+6l3gIAyoOggoDgdLHrxo3qP3GgwvS78hSqidWf0cBPn5aa8589APgL1qgg8OTnW0/xxMUpbPfvyo05XUvGLNPAHc/KdnZ1+5oVyuEDgO/j/1oisKSmSgkJ0uLF1vENN6j6W2/p6gYNJJXzCSEAgNcxooLA8fXXUocOVkiJiJDeeEP6z3+k/4UU6dRPCAEAfAtBBf4vJ0d6/HEpPt4aUTn3XOux4/vuK1HAjXL4AOBfmPqBf9u5Uxo4UNqwwToePlz6v/+TatZ0ejrl8AHAvxBU4L9mz7aCyd9/S/XrW/v03HDDKS+jHD4A+A+CCvzPsWNSYqL03nvWcbdu0vvvS82aebdfAAC3Y40K/MuGDdL551shJTRUeu45adkyQgoABChGVOAfCmqjjBkj5eZawWTOHGvvHgBAwCKowPelpEiDB1uPH0vWHj3//re1LgUAENCY+oFvW7zYqo3y9dfWkzwzZkgLFhBSACBIEFTgm3JypEcflXr3lg4dssrJbtggDRtWojYKACBwMfUD3/P771ZtlI0brePERGnyZJe1UQAAgYugAt9hjPU0z/33S8ePW6Xv33lHuv56b/cMAOAlTP2gzDy663BGhnTHHdai2ePHpcsvl376iZACAEGOERWUiUd3Hf7+e2uqJzlZqlZNRx96Vp+1H6NLc6qJArIAENwIKigTZ7sOVyaoJCdLq1bk69rtU9Tw5aes2igtWujPyXN0dkJXzwQiAIDfYeoHZeLOXYeTk6Wr2h1U7F3xajjpCSuk9O8vbd6sbzK7lghEAIDgxYgKysSduw4n/+sLrc1KUBP9pUzV1OYhU9X17aFSSIg9EBWMqFQmEAEA/B9BBSUkJzsPJOXddbjEfbKzlXb/GPV85xVJ0k86T0Mi5unDp9tKIYU/w12BCADg/wgqcOCuRbPF77P9k9/U5OEBqrdtkyTp9WoP6sT4SfpwQESJ+5c3EAEAApfH1qi88MIL6tq1q2rVqqV69eo5PWfv3r3q06ePatWqpSZNmuixxx5Tbm6up7qEMnC2aLZy9zHqn5mkmD7nK3zbJh1WQ/XVJ0rMm6qGp5UMKQAAFOWxoJKTk6P+/ftr+PDhTl/Py8tTnz59lJOTozVr1mjWrFlKSkrS2LFjPdUllIG7Fs126ybF1EzX+7pNSRqiGtnHlXXxlbo44id9pr6sPwEAlEmIMcZ48gckJSVpxIgRSktLc2j/8ssvde211+rAgQOKjo6WJE2fPl1PPPGE/vrrL4WFhZXp/hkZGYqKilJ6eroiIyPd3f2g5GqNSrmsW6eTtwxSjX27ZKpVU8j48dITTyh5TzX7vSXWogBAsCrr32+vrVFZu3at2rdvbw8pkhQfH6/hw4dr27Zt6tSpk9PrsrOzlZ2dbT/OyMjweF+DTaXWiOTnSy+9JD3zjGrk5UlnnKGQOXOkuDiHe3u0gBwAIGB4rY5KSkqKQ0iRZD9OSUlxed2ECRMUFRVl/2rWrJlH+wnnnJbTP3BA6tVLevJJKS9PuvVWafNme0gpyl1rYQAAga1cQWX06NEKCQkp9Wv79u2e6qskacyYMUpPT7d/7du3z6M/DyUVjIYkJFjfk5MlffaZ1KGDtHSpNUTy9tvS3LlSVJTTe7izgBwAIHCVa+pn1KhRSkhIKPUcWxnH72NiYvT99987tKWmptpfcyU8PFzh4eFl+hnwjKKjIbmZ2Tpx3+PSkqlWQ8eOVkBp06bUe1AvBQBQFuUKKo0bN1bjxo3d8oPj4uL0wgsv6NChQ2rSpIkkacmSJYqMjNQ555zjlp8BzygYDWmWuV0fhAzUOUs2Wy88/LC1PqWMQZJ6KQCAU/HYYtq9e/fq6NGj2rt3r/Ly8rR582ZJUqtWrVSnTh316tVL55xzju644w5NmjRJKSkpevrpp5WYmMiIiY+ztTTa/cw7qjfuIdXIyZQaNZKSkqQ+fbzdNQBAgPHY48kJCQmaNWtWifZly5bpiiuukCTt2bNHw4cP1/Lly1W7dm0NHjxYEydOVPXqZc9PPJ5cxdLSpPvukz74wDru0UN67z2paVOvdgsA4F/K+vfb43VUPI2gUoXWrpUGDZJ275aqVZOef156/HEplE24AQDl4/N1VOBH8vKkiROlceOsf27Z0low26WLt3sGAAhwBBWU7s8/pTvukJYts44HDpTeeMPlY8cAALgTY/YBwGnxNXdc/+mnVm2UZcuk2rWlmTOl998npAAAqgwjKn6utFL0Zdmzx+n1sSekxx6T/vUvSVL2uZ30xR3z1OGys2ULqaI3BgCACCp+z1kpemd76Xz+ubRnT8nQUvz6nz/4VbZ5A6Sff5YkpQ0dqZZzXlTa6HDVGs+ePACAqkVQ8XMFxdcKAknRXYmLBpD4eCknp+SoS+H1RveHvaXrxj8snciSGjeWkpK06K9rlPZ24X0KghAAAFWBNSp+rqAUfVKS8wAiSWFhVkiRSm4AaLNJ21b/V7suvEXTcoYp9ESW1LOn9NNP0jXXsCcPAMCrGFEJAM5K0RfdS6dGDWnIkMIRFYewsWaNzhg4UNq7V6peXXrxRWnUKHttFPbkAQB4E0ElgBWEivbtrZASFmatVbHZZNVDefFF6bnnrH+22azaKJ07O70PAQUA4A0ElQBXdK1KTo61oFb790u33y6tWGG9cNtt0uuvS1T2BQD4GIJKgCu+2DY+a6HUYah09KhVG+WNN6yCbgAA+CCCSoArWGOyZmmW+q58VFHDX7deuOACa6rnrLO820EAAEpBUAkCtqxtsk0dIG3dajU8+qj0wgvWohUAAHwYQSWQGSO9+aY0YoR04oTUpIn07rtWURUAAPwAdVQC1dGj0s03S/fdZ4WU+Hir2mwpIaWyewYBAOBujKgEolWrrCd59u2ziqhMmCA98oi9Noozpe0ZBACAtzCiEkhyc626KFdcYYWUVq2kNWscCrgVVXQExdmeQQAAeBsjKoFi3z5rFKUgYdx5p7X7cd26Tk93tmmhsz2DAADwJoJKIPj4Y2noUOm//5Xq1LFqo9x+e6mXFB9B2bOHUvkAAN9DUPFnWVnSyJHS9OnW8YUXau9Lc7VsXyt1Sy49bDjbdZlS+QAAX0NQ8WEFa0ecjnBs3SoNGCBt22YdP/64kof8Q+0vCCvTglg2GwQA+AMW03pIZR/1LVhDkpBgfbffxxhraueii6yQEh0tffWV9NJLWrU+jAWxAICAwoiKB7jjUV9nT+HY6h211qIsXGi9cPXVVhpq0kSS8+kcT/YRAABPY0TFA9zxqG9B6JCs71eFr5Q6dLBCSo0a0v/9n/Wozv9CilQ4nZOUdOrgwePIAAB/wIiKB5RnZMOVgtCxenmu+m7+h+rf9ryUn29tIjhvnnT++S6vK8vIiDv6CACApxFUPMBdC1Vt1fbI9s5t0nffWQ0JCdJrr1mPIPtIHwEA8CSCiodU+lHf//xHuvtuKS3NKto2fbo0aJC7uieJx5EBAL6PoOJrMjOtfXnefNM67txZmjuXRAEACEospvUlP/8sXXihFVJCQqTRo6XVqwkpAICgxYiKLzBGev11a/PA7GwpJkZ67z2pZ09v9wwAAK9iRKUCKlvMzcGRI1K/ftIDD1gh5ZprrJEVQgoAAIyolJdbC6UtX25tHvjnn1JYmDRpkvTQQ9a0DwAAYESlvNxSKC03V3rmGal7dyuknH22tG6d9PDDhBQAAIogqJRT8Yqx5S6Utnu3dNll0vPPW2tT7rpL2rhR6tSpTJe7ddoJAAAfx9RPOVWqUNqCBdI990jp6VJkpDRjhrUDchmxPw8AINgQVCqg3IXSjh+XRoyQ3nrLOr74YmnOHKlly3L9XKcbFRJUAAABjKkfT/vpJ6s2yltvWetPnnxSWrmy3CFFcsO0EwAAfoag4inGWPvydO4sbd8uNW0qffON9MILSt5Xo0LrTMqzOzIAAIGAqR9POHzYWiT76afW8bXXSjNnSo0aVXqdCfvzAACCCSMq7vbtt9J551khJSxMmjpV+uQTqVEjSW56vBkAgCBBUHGXkyelp56yKsoePCi1aSN9/7304IMOtVFYZwIAQNkx9eMOu3ZJgwZZRdsk6e67pVdflWrXLnFqpR5vBgAgyBBUKuuDD6Rhw6SMDCkqytr5+JZbSr2EdSYAAJQNQaWijh+39uV55x3rOC7Oqo1yxhle7RYAAIGENSoVsWmTdMEFVkgJCZGeftqqjUJIAQDArRhRKQ9jrKd4Hn9cysmRYmOl2bOlK6/0ds8AAAhIBJWy+usvacgQ6fPPrePrrpPeftv+2DEAAHA/pn7KYulSqzbK559L4eHSv/4lLVxISAEAwMMIKqU5eVIaM0a66iopJUVq29aqjZKY6FAbBQAAeAZTP64kJ0sDB1rBRLIeQX7llcJqbQAAwOMIKq488ogVUurVk/79b+nmm73dIwAAgg5BxZXXX7e+T50qtWjh3b4AABCkCCqunHaatGiRt3sBAEBQYzEtAADwWQQVAADgswgqAADAZxFUAACAzyKoAAAAn0VQAQAAPougAgAAfBZBBQAA+CyCCgAA8FkEFQAA4LMIKgAAwGcRVAAAgM8iqAAAAJ/l97snG2MkSRkZGV7uCQAAKKuCv9sFf8dd8fugcuzYMUlSs2bNvNwTAABQXseOHVNUVJTL10PMqaKMj8vPz9eBAwdUt25dhYSEuPXeGRkZatasmfbt26fIyEi33tsX8P78X6C/R96f/wv098j7qzhjjI4dO6bY2FiFhrpeieL3IyqhoaE6/fTTPfozIiMjA/I/wAK8P/8X6O+R9+f/Av098v4qprSRlAIspgUAAD6LoAIAAHwWQaUU4eHhGjdunMLDw73dFY/g/fm/QH+PvD//F+jvkffneX6/mBYAAAQuRlQAAIDPIqgAAACfRVABAAA+i6ACAAB8VlAHlRdeeEFdu3ZVrVq1VK9ePafn7N27V3369FGtWrXUpEkTPfbYY8rNzS31vkePHtVtt92myMhI1atXT0OHDtXff//tgXdQPsuXL1dISIjTrx9++MHldVdccUWJ8++7774q7HnZnXHGGSX6OnHixFKvOXHihBITE9WwYUPVqVNHN910k1JTU6uox2W3e/duDR06VC1btlTNmjV15plnaty4ccrJySn1Ol///KZNm6YzzjhDERER6tKli77//vtSz1+wYIHatGmjiIgItW/fXl988UUV9bR8JkyYoIsuukh169ZVkyZN1K9fP+3YsaPUa5KSkkp8VhEREVXU4/J79tlnS/S3TZs2pV7jL5+f5Px/T0JCQpSYmOj0fH/4/FauXKm+ffsqNjZWISEhWrhwocPrxhiNHTtWTZs2Vc2aNdWzZ0/9/vvvp7xveX+PyyOog0pOTo769++v4cOHO309Ly9Pffr0UU5OjtasWaNZs2YpKSlJY8eOLfW+t912m7Zt26YlS5bos88+08qVKzVs2DBPvIVy6dq1qw4ePOjwdffdd6tly5a68MILS732nnvucbhu0qRJVdTr8hs/frxDXx988MFSz3/kkUf06aefasGCBVqxYoUOHDigG2+8sYp6W3bbt29Xfn6+ZsyYoW3btumVV17R9OnT9eSTT57yWl/9/D744AONHDlS48aN048//qgOHTooPj5ehw4dcnr+mjVrNHDgQA0dOlSbNm1Sv3791K9fP23durWKe35qK1asUGJiotatW6clS5bo5MmT6tWrl44fP17qdZGRkQ6f1Z49e6qoxxVz7rnnOvR39erVLs/1p89Pkn744QeH97ZkyRJJUv/+/V1e4+uf3/Hjx9WhQwdNmzbN6euTJk3S1KlTNX36dK1fv161a9dWfHy8Tpw44fKe5f09LjcDM3PmTBMVFVWi/YsvvjChoaEmJSXF3vbGG2+YyMhIk52d7fRev/zyi5FkfvjhB3vbl19+aUJCQsyff/7p9r5XRk5OjmncuLEZP358qeddfvnl5uGHH66aTlVSixYtzCuvvFLm89PS0kyNGjXMggUL7G2//vqrkWTWrl3rgR6616RJk0zLli1LPceXP7/OnTubxMRE+3FeXp6JjY01EyZMcHr+LbfcYvr06ePQ1qVLF3Pvvfd6tJ/ucOjQISPJrFixwuU5rv63yFeNGzfOdOjQoczn+/PnZ4wxDz/8sDnzzDNNfn6+09f97fOTZD7++GP7cX5+vomJiTGTJ0+2t6WlpZnw8HAzd+5cl/cp7+9xeQX1iMqprF27Vu3bt1d0dLS9LT4+XhkZGdq2bZvLa+rVq+cwQtGzZ0+FhoZq/fr1Hu9zeXzyySc6cuSIhgwZcspz33//fTVq1Ejt2rXTmDFjlJmZWQU9rJiJEyeqYcOG6tSpkyZPnlzqVN3GjRt18uRJ9ezZ097Wpk0bNW/eXGvXrq2K7lZKenq6GjRocMrzfPHzy8nJ0caNGx3+3YeGhqpnz54u/92vXbvW4XzJ+p30l89K0ik/r7///lstWrRQs2bNdP3117v83xpf8fvvvys2NlY2m0233Xab9u7d6/Jcf/78cnJyNHv2bN11112lboDrb59fUbt27VJKSorDZxQVFaUuXbq4/Iwq8ntcXn6/KaEnpaSkOIQUSfbjlJQUl9c0adLEoa169epq0KCBy2u85e2331Z8fPwpN3UcNGiQWrRoodjYWP3888964okntGPHDn300UdV1NOye+ihh3T++eerQYMGWrNmjcaMGaODBw/q5Zdfdnp+SkqKwsLCSqxRio6O9rnPq7idO3fqtdde05QpU0o9z1c/v8OHDysvL8/p79j27dudXuPqd9LXP6v8/HyNGDFCl1xyidq1a+fyvNatW+udd97Reeedp/T0dE2ZMkVdu3bVtm3bPL75akV06dJFSUlJat26tQ4ePKjnnntO3bp109atW1W3bt0S5/vr5ydJCxcuVFpamhISElye42+fX3EFn0N5PqOK/B6XV8AFldGjR+ull14q9Zxff/31lAu+/ElF3vP+/fv11Vdfaf78+ae8f9H1Ne3bt1fTpk3Vo0cP/fHHHzrzzDMr3vEyKs/7GzlypL3tvPPOU1hYmO69915NmDDBZ0tcV+Tz+/PPP3X11Verf//+uueee0q91tufH6TExERt3bq11PUbkhQXF6e4uDj7cdeuXdW2bVvNmDFD//jHPzzdzXLr3bu3/Z/PO+88denSRS1atND8+fM1dOhQL/bM/d5++2317t1bsbGxLs/xt8/PXwRcUBk1alSpiVeSbDZbme4VExNTYuVywdMgMTExLq8pvoAoNzdXR48edXlNZVXkPc+cOVMNGzbUddddV+6f16VLF0nW/6Ovij90lflMu3TpotzcXO3evVutW7cu8XpMTIxycnKUlpbmMKqSmprqsc+ruPK+vwMHDujKK69U165d9eabb5b751X15+dKo0aNVK1atRJPWJX27z4mJqZc5/uCBx54wL6ovrz/r7pGjRrq1KmTdu7c6aHeuVe9evV09tlnu+yvP35+krRnzx5988035R6F9LfPr+BzSE1NVdOmTe3tqamp6tixo9NrKvJ7XG5uWeni5061mDY1NdXeNmPGDBMZGWlOnDjh9F4Fi2k3bNhgb/vqq698ajFtfn6+admypRk1alSFrl+9erWRZH766Sc398z9Zs+ebUJDQ83Ro0edvl6wmPbDDz+0t23fvt1nF9Pu37/fnHXWWWbAgAEmNze3Qvfwpc+vc+fO5oEHHrAf5+XlmdNOO63UxbTXXnutQ1tcXJxPLsbMz883iYmJJjY21vz2228Vukdubq5p3bq1eeSRR9zcO884duyYqV+/vvnnP//p9HV/+vyKGjdunImJiTEnT54s13W+/vnJxWLaKVOm2NvS09PLtJi2PL/H5e6nW+7ip/bs2WM2bdpknnvuOVOnTh2zadMms2nTJnPs2DFjjPUfWbt27UyvXr3M5s2bzeLFi03jxo3NmDFj7PdYv369ad26tdm/f7+97eqrrzadOnUy69evN6tXrzZnnXWWGThwYJW/P1e++eYbI8n8+uuvJV7bv3+/ad26tVm/fr0xxpidO3ea8ePHmw0bNphdu3aZRYsWGZvNZi677LKq7vYprVmzxrzyyitm8+bN5o8//jCzZ882jRs3Nnfeeaf9nOLvzxhj7rvvPtO8eXPz7bffmg0bNpi4uDgTFxfnjbdQqv3795tWrVqZHj16mP3795uDBw/av4qe40+f37x580x4eLhJSkoyv/zyixk2bJipV6+e/Um7O+64w4wePdp+/nfffWeqV69upkyZYn799Vczbtw4U6NGDbNlyxZvvQWXhg8fbqKioszy5csdPqvMzEz7OcXf33PPPWe++uor88cff5iNGzeaAQMGmIiICLNt2zZvvIVTGjVqlFm+fLnZtWuX+e6770zPnj1No0aNzKFDh4wx/v35FcjLyzPNmzc3TzzxRInX/PHzO3bsmP1vnSTz8ssvm02bNpk9e/YYY4yZOHGiqVevnlm0aJH5+eefzfXXX29atmxpsrKy7Pfo3r27ee211+zHp/o9rqygDiqDBw82kkp8LVu2zH7O7t27Te/evU3NmjVNo0aNzKhRoxxS9bJly4wks2vXLnvbkSNHzMCBA02dOnVMZGSkGTJkiD38+IKBAwearl27On1t165dDv8O9u7day677DLToEEDEx4eblq1amUee+wxk56eXoU9LpuNGzeaLl26mKioKBMREWHatm1rXnzxRYfRr+LvzxhjsrKyzP3332/q169vatWqZW644QaHP/6+YubMmU7/ey06MOqPn99rr71mmjdvbsLCwkznzp3NunXr7K9dfvnlZvDgwQ7nz58/35x99tkmLCzMnHvuuebzzz+v4h6XjavPaubMmfZzir+/ESNG2P9dREdHm2uuucb8+OOPVd/5Mrr11ltN06ZNTVhYmDnttNPMrbfeanbu3Gl/3Z8/vwJfffWVkWR27NhR4jV//PwK/mYV/yp4H/n5+eaZZ54x0dHRJjw83PTo0aPEe2/RooUZN26cQ1tpv8eVFWKMMe6ZRAIAAHAv6qgAAACfRVABAAA+i6ACAAB8FkEFAAD4LIIKAADwWQQVAADgswgqAADAZxFUAACAzyKoAAAAn0VQAQAAPougAgAAfBZBBQAA+Kz/B3FJTBA1g6YPAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 生成100组数据\n",
    "dataset = list(creat_data(100))\n",
    "\n",
    "x_target = np.array([-10, 10, 0.1])\n",
    "y_target = 2.0 * x_target + 3.0\n",
    "\n",
    "x_train, y_train = zip(*dataset)\n",
    "\n",
    "plt.scatter(x_train, y_train, color=\"blue\", s=3)\n",
    "plt.plot(x_target, y_target, color=\"red\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7718d42d",
   "metadata": {},
   "source": [
    "使用mindspore中的`dataset`模块来加载和处理数据。\n",
    "- `GeneratorDataset`可以将数据转换为MindSpore的数据集格式，并且将生成的数据的x，y值存入到`data`和`label`的数组中。\n",
    "- `batch`将batch_size个数据组合成一个batch，`drop_remainder`代表是否会把最后构不成一批的数据丢弃掉，默认是不丢弃。\n",
    "- `repeat`将数据集变成repeat_num倍。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "7bc7f7d6",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[WARNING] ME(15440:7036,MainProcess):2022-10-12-11:22:37.330.18 [mindspore\\dataset\\engine\\datasets_user_defined.py:656] Python multiprocessing is not supported on Windows platform.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The size of train_dataset:  10\n",
      "dict_keys(['data', 'label'])\n",
      "The x label value shape: (10, 1)\n",
      "The y label value shape: (10, 1)\n"
     ]
    }
   ],
   "source": [
    "import mindspore.dataset as ds\n",
    "\n",
    "def create_dataset(data_num, batch_size, repeat_num):\n",
    "    dataset = ds.GeneratorDataset(list(create_data(data_num)), column_names=['data', 'label'])\n",
    "    dataset = dataset.batch(batch_size, drop_remainder=True)\n",
    "    dataset = dataset.repeat(repeat_num)\n",
    "    return dataset\n",
    "\n",
    "# 创建训练数据集\n",
    "train_dataset = create_dataset(data_num=100, batch_size=10, repeat_num=1)\n",
    "\n",
    "print(\"The size of train_dataset: \", train_dataset.get_dataset_size())\n",
    "# 查看迭代数据\n",
    "onedata = next(train_dataset.create_dict_iterator())\n",
    "print(onedata.keys())\n",
    "print(\"The x label value shape:\", onedata[\"data\"].shape)\n",
    "print(\"The y label value shape:\", onedata[\"label\"].shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c73ececc",
   "metadata": {},
   "source": [
    "将数据集处理成了10组，每组10对数据，`data`是x，`label`是y。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mindspore",
   "language": "python",
   "name": "mindvision"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
